//
//  BAHomeViewController.swift
//  BAweibo
//
//  Created by baggio on 2017/8/1.
//  Copyright © 2017年 baggio. All rights reserved.
//

import UIKit
import SVProgressHUD

class BAHomeViewController: BABaseViewController {
    
    //    //保存模型数组
    //    //封装到 BAHomeListViewModel 中
    //    fileprivate lazy var dataArray: [BAHomeModel] = [BAHomeModel]()
    fileprivate lazy var homeListViewModel: BAHomeListViewModel = BAHomeListViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //未登录，进入 访客视图 BAVisitorView
        if !isLogin {
            //传2个 nil，因为 BAVisitorView 本来就是按照 home 设计的
            visitorView?.setUpVisitorViewInfo(logoImageName: nil, message: nil)
            return
        } else {
            //登录，进入 自己的视图
            setUpUI()
            
            //设置 tableView 
            setUpTableViewInfo()
            
            //请求首页数据
            loadHomeData()
        }
    }
    
    private func setUpTableViewInfo() {
        //设置数据源
        tableView.dataSource = self
        //设置代理
        tableView.delegate = self
        
        //注册 cell，先使用系统 cell
        //tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        //使用自定义的 cell
        tableView.register(BAHomeCell.self, forCellReuseIdentifier: "cell")
        
        //测试
        //            tableView.rowHeight = 200
        //改成 自动计算
        tableView.rowHeight = UITableViewAutomaticDimension
        //预估值（预估值越接近真实值越好）
        tableView.estimatedRowHeight = 200
        
        //tableView 默认有个墨绿色的边界，要去掉
        tableView.separatorStyle = .none
        
        //底部菊花
        tableView.tableFooterView = footerView
        //开启动画，不会自动消失，需要某个时刻（加载数据完成后） stopAnimating()，
        //要在显示最后一个 cell 的时候才开启，需要实现 UITableViewDelegate
//        footerView.startAnimating()
        
        //下拉刷新控件，不需要指定 constraint
        tableView.addSubview(refreshControl)
    }
    
    
    //上拉加载更多，底部菊花
    fileprivate lazy var footerView: UIActivityIndicatorView = {
        let v = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) //whiteLarge 没有提示
        //不是 v.backgroundColor
        v.color = BA_COLOR_APP_THEME
        return v
    }()
    
    //下拉刷新控件，UIRefreshControl 继承于 UIView，UIRefreshControl 里面有一个方法（sendAction）可以添加触发事件通知外界，与外界的 addTarget 对应（for: 事件参数要一致）；用 UIView 也可以，要使用闭包来通知
    // UIRefreshControl 换成自定义的 BARefreshControl，WBRefreshControl
    fileprivate lazy var refreshControl: BARefreshControl = {
        let v = BARefreshControl()
        v.bgColor = BA_COLOR_APP_THEME
        v.addTarget(self, action: #selector(refreshAction), for: UIControlEvents.valueChanged)
        return v
    }()
    
    //顶部提示
    //默认缩在 navigationBar 后面不显示，在首次登录和下拉刷新的时候显示，显示完了后再缩到 navigationBar 后面不显示
    fileprivate lazy var pullDownTipLabel: UILabel = {
        let label = UILabel(textAlignment: .center, text: "更新了xx条微博", textColor: UIColor.white, fontSize: 14, numberOfLines: 0, alpha: 1)
        label.backgroundColor = BA_COLOR_APP_THEME
        //64是 navigationBar 的高度，自定义高度30，
        label.frame = CGRect(x: 0, y: 64-30, width: BA_SCREEN_WIDTH, height: 30)
        //如果不隐藏，navigationBar 背后会显示 pullDownTipLabel 的颜色
        label.isHidden = true
        return label
    }()
    
    @objc private func refreshAction() {
        loadHomeData()
    }
    
    private func setUpUI() {
        //测试
        //view.backgroundColor=randomColor()

        setUpNav()
        
        //顶部提示
        navigationController?.view.insertSubview(pullDownTipLabel, belowSubview: navigationController!.navigationBar)
        
        //没有上面那句话好
//        navigationController?.navigationBar.insertSubview(pullDownTipLabel, at: 0)
    }
    
    private func setUpNav() {
        
        //自定义 导航栏左/右上角的 UIBarButtonItem
//        let leftBtn=UIButton()
//        leftBtn.setImage(UIImage(named:"navigationbar_pop"), for: .normal)
//        leftBtn.setImage(UIImage(named:"navigationbar_pop_highlighted"), for: .highlighted)
//        leftBtn.addTarget(self, action: #selector(leftBtnClick), for: .touchUpInside)
//        //没有这句话，btn不显示
//        leftBtn.sizeToFit()
//        
//        navigationItem.leftBarButtonItem=UIBarButtonItem(customView: leftBtn)
        
        //改用扩展后的 UIBarButtonItem 的便利构造函数
        navigationItem.leftBarButtonItem=UIBarButtonItem(title: nil, imgName: "navigationbar_pop", target: self, action: #selector(leftBtnClick))
        
//        let rightBtn=UIButton()
//        rightBtn.setImage(UIImage(named:"navigationbar_friendsearch"), for: .normal)
//        rightBtn.setImage(UIImage(named:"navigationbar_friendsearch_highlighted"), for: .highlighted)
//        rightBtn.addTarget(self, action: #selector(rightBtnClick), for: .touchUpInside)
//        rightBtn.sizeToFit()
//        
//        navigationItem.rightBarButtonItem=UIBarButtonItem(customView: rightBtn)
        
        //改用扩展后的 UIBarButtonItem 的便利构造函数
        navigationItem.rightBarButtonItem=UIBarButtonItem(title: nil, imgName: "navigationbar_friendsearch", target: self, action: #selector(rightBtnClick))
        
    }
    
    @objc private func leftBtnClick(){
        //print("left按钮点击")
    }
    
    @objc private func rightBtnClick(){
        //print("right按钮点击")
        
        //push到下一个控制器后，需要隐藏下面的 tabBar
        let tempVc=BATempViewController()
        tempVc.hidesBottomBarWhenPushed=true
        
        //push 到下一个控制器
        navigationController?.pushViewController(tempVc, animated: true)
    }
}


//访问网络
//封装到 BAHomeViewModel 中
extension BAHomeViewController {
    
    fileprivate func loadHomeData() {
        
        //show()不会自动消失，需要 dismiss()
        SVProgressHUD.show(withStatus: "请求数据")
        
        //改用 WBRefreshView.xib 添加这句话
        //refreshControl.beginRefreshing()
        
        //需要加一个参数 isPullUP，判断是下拉刷新还是上拉加载更多，isPullUP 可以由 footerView.isAnimating 来判断
        homeListViewModel.loadHomeData(isPullUP: footerView.isAnimating) { (isSucceeded, count) in
            if isSucceeded {
                //刷新 tableView
                self.tableView.reloadData()
                SVProgressHUD.dismiss()
                
                //只有在首次登陆和下拉更新时才显示顶部提示，用 !footerView.isAnimating 来判断
                if !self.footerView.isAnimating {
                    self.setUpPullDownTipLabel(updateCount: count)
                }
                
            } else {
                print("请求首页数据失败")
                SVProgressHUD.dismiss()
                //showInfo()会自动消失
                SVProgressHUD.showInfo(withStatus: "请求首页数据失败")
                //return
            }

            //结束底部菊花动画
            self.footerView.stopAnimating()
            
            //结束顶部下拉刷新动画
            self.refreshControl.endRefreshing()
        }
        
//        let urlString="https://api.weibo.com/2/statuses/home_timeline.json"
//        let params=[
//            "access_token": BAOAuthViewModel.share.oAuthModel?.access_token
//        ]
//        
//        BANetworkingTools.share.request(type: .get, urlString: urlString, parameters: params, success: { (response) in
//            //print("请求首页数据成功", response)
//            //转字典
//            guard let resDict = response as? [String: Any] else {
//                return
//            }
//            //取得 statuses 的值，再转字典数组
//            guard let statusArr = resDict["statuses"] as? [[String: Any]] else {
//                return
//            }
//            //利用 YYModel 把字典数组转模型数组
//            guard let modelArr = NSArray.yy_modelArray(with: BAHomeModel.self, json: statusArr) as? [BAHomeModel] else {
//                return
//            }
//            //默认返回20条微博
//            //print(modelArr.count)
//            
//            self.dataArray = modelArr
//            
//            //刷新 tableView，这句话千万不能忘了
//            self.tableView.reloadData()
//            
//        }) { (error) in
//            print("请求首页数据失败", error)
//        }
    }
    
    //显示顶部提示
    private func setUpPullDownTipLabel(updateCount: Int) {
        
        //添加这句话，一次没完成，不能重复显示，用 pullDownTipLabel.isHidden 来判断
        if pullDownTipLabel.isHidden == false {
            return
        }
        
        //显示
        pullDownTipLabel.isHidden = false
        if updateCount > 0 {
            pullDownTipLabel.text = "更新了\(updateCount)条微博"
        } else {
            pullDownTipLabel.text = "已经是最新微博了"
        }
        
        //以动画的方式下移30
        UIView.animate(withDuration: 1, animations: { 
            self.pullDownTipLabel.transform = CGAffineTransform(translationX: 0, y: 30)
        }) { (_) in
            //延时1秒后再恢复
            UIView.animate(withDuration: 1, delay: 1, options: [], animations: { 
                self.pullDownTipLabel.transform = CGAffineTransform.identity
            }, completion: { (_) in
                //隐藏
                self.pullDownTipLabel.isHidden = true
            })
        }
    }
}

// dataSource
extension BAHomeViewController: UITableViewDataSource, UITableViewDelegate {
    //cell 数量
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//        return self.dataArray.count
        return homeListViewModel.dataArray.count
    }
    
    //创建 cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //先使用系统 cell
//        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
//        cell.backgroundColor = randomColor()
        
        //使用自定义的 cell
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BAHomeCell
        
        //给 BAHomeCell 中的 homeModel 赋值
//        cell.homeModel = dataArray[indexPath.row]
        
        //改成 homeListViewModel 中的 dataArray
//        cell.homeModel = homeListViewModel.dataArray[indexPath.row]
        
        //改成 homeViewModel
        cell.homeViewModel = homeListViewModel.dataArray[indexPath.row]
        
        
        //这段代码可以从下面的方法中搬上来
        //显示最后一个 cell 的时候开启动画，刷新数据
        //添加 && !footerView.isAnimating，不要重复执行
        if indexPath.row == homeListViewModel.dataArray.count - 1 && !footerView.isAnimating {
            //print(indexPath.row)
            footerView.startAnimating()
            
            //刷新数据
            loadHomeData()
        }
        
        return cell
    }
    
    //显示最后一个 cell 的时候开启动画，刷新数据
    //可以和上面的方法合并
//    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
//        //0-19
//        
//        //添加 && !footerView.isAnimating，不要重复执行
//        if indexPath.row == homeListViewModel.dataArray.count - 1 && !footerView.isAnimating {
//            //print(indexPath.row)
//            footerView.startAnimating()
//            
//            //刷新数据
//            loadHomeData()
//        }
//    }
}
